package com.yhh.college_information_platform.service;

import com.yhh.college_information_platform.common.PageResult;
import com.yhh.college_information_platform.dto.ResourceQueryDTO;
import com.yhh.college_information_platform.dto.ResourceUploadDTO;
import com.yhh.college_information_platform.vo.ResourceVO;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * 资料Service接口
 *
 * @author yhh
 * @date 2025-10-25
 */
public interface ResourceService {

    /**
     * 分页查询资料列表
     *
     * @param queryDTO 查询条件
     * @param userId 当前用户ID（用于判断是否点赞/收藏）
     * @return 分页结果
     */
    PageResult<ResourceVO> getResourcePage(ResourceQueryDTO queryDTO, Long userId);

    /**
     * 获取最新上传的资料列表
     *
     * @param limit 数量限制
     * @return 资料列表
     */
    List<ResourceVO> getLatestResources(Integer limit);

    /**
     * 获取热门资料列表（按下载量排序）
     *
     * @param limit 数量限制
     * @return 资料列表
     */
    List<ResourceVO> getHotResources(Integer limit);

    /**
     * 根据ID获取资料详情
     *
     * @param id 资料ID
     * @param userId 当前用户ID（用于判断是否点赞/收藏）
     * @return 资料详情
     */
    ResourceVO getResourceById(Long id, Long userId);

    /**
     * 获取用户上传的资料列表
     *
     * @param userId 用户ID
     * @param current 当前页
     * @param size 每页大小
     * @return 分页结果
     */
    PageResult<ResourceVO> getUserResources(Long userId, Integer current, Integer size);

    /**
     * 增加资料浏览次数
     *
     * @param id 资料ID
     */
    void incrementViewCount(Long id);

    /**
     * 增加资料下载次数
     *
     * @param id 资料ID
     */
    void incrementDownloadCount(Long id);

    /**
     * 上传文件到对象存储
     *
     * @param file 文件
     * @return 文件访问URL
     */
    String uploadFile(MultipartFile file);

    /**
     * 上传封面图片到对象存储
     *
     * @param file 图片文件
     * @return 图片访问URL
     */
    String uploadCoverImage(MultipartFile file);

    /**
     * 上传资料
     *
     * @param uploadDTO 上传信息
     * @param userId 上传者ID
     * @return 资料ID
     */
    Long uploadResource(ResourceUploadDTO uploadDTO, Long userId);

    /**
     * 删除资料
     *
     * @param id 资料ID
     * @param userId 当前用户ID
     */
    void deleteResource(Long id, Long userId);

    /**
     * 更新资料
     *
     * @param id 资料ID
     * @param uploadDTO 更新信息
     * @param userId 当前用户ID
     */
    void updateResource(Long id, ResourceUploadDTO uploadDTO, Long userId);

    /**
     * 审核资料（管理员）
     *
     * @param id 资料ID
     * @param status 审核状态（1-通过 2-拒绝）
     * @param rejectReason 拒绝原因
     * @param adminId 管理员ID
     */
    void auditResource(Long id, Integer status, String rejectReason, Long adminId);

    /**
     * 删除资料（管理员）
     *
     * @param id 资料ID
     * @param adminId 管理员ID
     */
    void deleteResourceByAdmin(Long id, Long adminId);

    /**
     * 获取资料下载URL
     *
     * @param id 资料ID
     * @param userId 用户ID
     * @return 文件下载URL
     */
    String getDownloadUrl(Long id, Long userId);

    /**
     * 获取资料下载信息（包括URL和原始文件名）
     *
     * @param id 资料ID
     * @param userId 用户ID
     * @return 包含fileUrl和fileName的Map
     */
    Map<String, String> getDownloadInfo(Long id, Long userId);
}

